﻿namespace AlgoHero.Modelo
{
    using System;
    using System.Collections;
    using System.Collections.Generic;    
    using System.Text;

    public class NodoTemporal
    {
        #region Atributos
                
        private double tiempoDeInicio; // tiempo físico en segundos, donde empieza el acorde
        private double duracionFisica; // tiempo físico en segundos, cuanto tiempo se mantienen presionadas las teclas
        private IList<Tecla> teclas; // conjunto de teclas a apretar
        private Acorde acorde; // guardamos una referencia al acorde correspondiente

        #endregion

        #region Constructor

        public NodoTemporal(Acorde acorde, double tiempoDeInicio, double duracionFisica, IList<Tecla> teclas)
        {
            /* Precondiciones: tiempoDeInicio debe ser >= 0, duracion debe ser > 0
             * Postcondicion: Lanza ArgumentException en caso de parámetros inválidos.
             */

            if (tiempoDeInicio < 0 || duracionFisica <= 0)
            {
                throw new ArgumentException("El tiempoDeInicio debe ser >= 0 y/o la duracion > 0.");
            }

            this.tiempoDeInicio = tiempoDeInicio;
            this.duracionFisica = duracionFisica;
            this.teclas = teclas;
            this.acorde = acorde;

        }

        #endregion

        #region Propiedades

        public double TiempoDeInicio
        {
            get { return this.tiempoDeInicio; }
        }

        public IList<Tecla> Teclas
        {
            get { return this.teclas; }
        }

        public double DuracionFisica
        {
            get { return this.duracionFisica; }
        }

        public Acorde Acorde
        {
            get { return this.acorde; }
        }

        #endregion

        #region Métodos

        public override bool Equals(object obj)
        {
            NodoTemporal otroNodo;

            try
            {
                otroNodo = (NodoTemporal)obj;
                return (this == otroNodo);
            }
            catch
            {
                return false;
            }
        }

        public static bool operator ==(NodoTemporal unNodo, NodoTemporal otroNodo)
        {
            return ((unNodo.tiempoDeInicio == otroNodo.tiempoDeInicio)); 
        }
        public static bool operator !=(NodoTemporal unNodo, NodoTemporal otroNodo)
        {
            return !(unNodo == otroNodo);
        }

        #endregion
    }
}
